\section{MIPS}

\subsection{\Registers}
\label{MIPS_registers_ref}

\myindex{MIPS!O32}
( \RU{Соглашение о вызовах O32}\EN{O32 calling convention} )

\subsubsection{\RU{Регистры общего пользования}\EN{General purpose registers} \ac{GPR}}

\small
\begin{center}
\begin{tabular}{ | l | l | l | }
\hline
\HeaderColor \RU{Номер}\EN{Number} & 
\HeaderColor \RU{Псевдоимя}\EN{Pseudoname} & 
\HeaderColor \RU{Описание}\EN{Description} \\
\hline
\$0             & \$ZERO          & \RU{Всегда ноль. Запись в этот регистр это как}\EN{Always zero. Writing to this register is like} \ac{NOP}. \\
\hline
\$1             & \$AT            & \RU{Используется как временный регистр}\EN{Used as a temporary register} \\
                &                 & \RU{для ассемблерных макросов и псевдоинструкций}\EN{for assembly macros and pseudo instructions}. \\
\hline
\$2 \dots \$3   & \$V0 \dots \$V1 & \RU{Здесь возвращается результат функции}\EN{Function result is returned here}. \\
\hline
\$4 \dots \$7   & \$A0 \dots \$A3 & \RU{Аргументы функции}\EN{Function arguments}. \\
\hline
\$8 \dots \$15  & \$T0 \dots \$T7 & \RU{Используется для временных данных}\EN{Used for temporary data}. \\
\hline
\$16 \dots \$23 & \$S0 \dots \$S7 & \RU{Используется для временных данных}\EN{Used for temporary data}\AsteriskOne{}. \\
\hline
\$24 \dots \$25 & \$T8 \dots \$T9 & \RU{Используется для временных данных}\EN{Used for temporary data}. \\
\hline
\$26 \dots \$27 & \$K0 \dots \$K1 & \RU{Зарезервировано для ядра \ac{OS}}\EN{Reserved for \ac{OS} kernel}. \\
\hline
\$28            & \$GP            & \RU{Глобальный указатель}\EN{Global Pointer}\AsteriskTwo{}. \\
\hline
\$29            & \$SP            & \ac{SP}\AsteriskOne{}. \\
\hline
\$30            & \$FP            & \ac{FP}\AsteriskOne{}. \\
\hline
\$31            & \$RA            & \ac{RA}. \\
\hline
n/a             & PC              & \ac{PC}. \\
\hline
n/a             & HI              & \RU{старшие 32 бита результата умножения или остаток от деления}\EN{high 32 bit of multiplication or division remainder}\AsteriskThree{}. \\
\hline
n/a             & LO              & \RU{младшие 32 бита результата умножения или результат деления}\EN{low 32 bit of multiplication and division remainder}\AsteriskThree{}. \\
\hline
\end{tabular}
\end{center}
\normalsize

\subsubsection{\RU{Регистры для работы с числами с плавающей точкой}\EN{Floating-point registers}}
\label{MIPS_FPU_registers}

\begin{center}
\begin{tabular}{ | l | l | l | }
\hline
\HeaderColor \RU{Название}\EN{Name} & \HeaderColor \RU{Описание}\EN{Description} \\
\hline
\$F0..\$F1   & \RU{Здесь возвращается результат функции}\EN{Function result returned here}. \\
\hline
\$F2..\$F3   & \RU{Не используется}\EN{Not used}. \\
\hline
\$F4..\$F11  & \RU{Используется для временных данных}\EN{Used for temporary data}. \\
\hline
\$F12..\$F15 & \RU{Первые два аргумента функции}\EN{First two function arguments}. \\
\hline
\$F16..\$F19 & \RU{Используется для временных данных}\EN{Used for temporary data}. \\
\hline
\$F20..\$F31 & \RU{Используется для временных данных}\EN{Used for temporary data}\AsteriskOne{}. \\
\hline
%fcr31 & Control/status register. \\
%\hline
\end{tabular}
\end{center}

\AsteriskOne{}\EMDASH{}\Gls{callee} \RU{должен сохранять}\EN{must preserve the value}.\\
\AsteriskTwo{}\EMDASH{}\Gls{callee} \RU{должен сохранять}\EN{must preserve the value} (\RU{кроме \ac{PIC}-кода}
\EN{except in \ac{PIC} code}).\\
\myindex{MIPS!\Instructions!MFLO}
\myindex{MIPS!\Instructions!MFHI}
\AsteriskThree{}\EMDASH{}\RU{доступны используя инструкции}\EN{accessible using the} \TT{MFHI} \AndENRU \TT{MFLO}\EN{ instructions}.\\

\subsection{\Instructions}

\RU{Есть три типа инструкций}\EN{There are 3 kinds of instructions}:

\begin{itemize}

\item \RU{Тип R: имеющие 3 регистра. R-инструкции обычно имеют такой вид:}
\EN{R-type: those which have 3 registers. R-instruction usually have the following form:}

\begin{lstlisting}
instruction destination, source1, source2
\end{lstlisting}

\RU{Важно помнить, что если первый и второй регистр один и тот же, IDA может показать инструкцию в сокращенной
форме:}
\EN{One important thing to keep in mind is that when the first and second register are the same, 
IDA may show the instruction in its shorter form:}

\begin{lstlisting}
instruction destination/source1, source2
\end{lstlisting}

\RU{Это немного напоминает Интеловский синтаксис ассемблера x86.}
\EN{That somewhat reminds us of the Intel syntax for x86 assembly language.}

\item \RU{Тип I: имеющие 2 регистра и 16-битное \q{immediate}-значение.}
\EN{I-type: those which have 2 registers and a 16-bit immediate value.}

\item \RU{Тип J: инструкции перехода, имеют 26 бит для кодирования смещения.}
\EN{J-type: jump/branch instructions, have 26 bits for encoding the offset.}

\end{itemize}

\subsubsection{\RU{Инструкции перехода}\EN{Jump instructions}}

\RU{Какая разница между инструкциями начинающихся с B- (BEQ, B, итд) и с J- (JAL, JALR, итд)?}
\EN{What is the difference between B- instructions (BEQ, B, etc.) and J- ones (JAL, JALR, etc.)?}

\RU{B-инструкции имеют тип I, так что, смещение в этих инструкциях кодируется как 16-битное значение.}
\EN{The B-instructions have an I-type, hence, the B-instructions' offset is encoded as a 16-bit immediate.}
\RU{Инструкции JR и JALR имеют тип R, и они делают переход по абсолютному адресу указанному в регистре.}
\EN{JR and JALR are R-type and jump to an absolute address specified in a register.}
\RU{J и JAL имеют тип J, так что смещение кодируется как 26-битное значение.}
\EN{J and JAL are J-type, hence the offset is encoded as a 26-bit immediate.}

\RU{Коротко говоря, в B-инструкциях можно кодировать условие 
(B на самом деле это псевдоинструкция для \TT{BEQ \$ZERO, \$ZERO, LABEL}),
а в J-инструкциях нельзя.}
\EN{In short, B-instructions can encode a condition 
(B is in fact pseudo instruction for \TT{BEQ \$ZERO, \$ZERO, LABEL}), 
while J-instructions can't.}
